package com.hliushi.item.canal;

import com.github.benmanes.caffeine.cache.Cache;
import com.hliushi.item.config.RedisHandler;
import com.hliushi.item.pojo.Item;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import top.javatool.canal.client.annotation.CanalTable;
import top.javatool.canal.client.handler.EntryHandler;

import javax.annotation.Resource;

/**
 * @author llhuang10
 * @date 2021/9/20 15:59
 */
@Component
@CanalTable("tb_item")  // 指定要监听的表
public class ItemHandler implements EntryHandler<Item> {


    @Resource
    private RedisTemplate<String, Object> redisTemplate;

    @Resource
    private Cache<Long, Item> itemCache;


    @Override
    public void insert(Item item) {
        // 写数据到JVM进程缓存   --> 先写JVM进程缓存, 效率比redis高
        itemCache.put(item.getId(), item);
        // 写数据到redis
        redisTemplate.opsForValue().set(RedisHandler.ITEM_KEY + item.getId(), item);
    }

    /**
     * @param before
     * @param after
     */
    @Override
    public void update(Item before, Item after) {
        // 写数据到JVM进程缓存   --> 先写JVM进程缓存, 效率比redis高
        itemCache.put(after.getId(), after);
        // 写数据到redis
        redisTemplate.opsForValue().set(RedisHandler.ITEM_KEY + after.getId(), after);

    }

    @Override
    public void delete(Item item) {
        // 删除数据到JVM进程缓存
        itemCache.invalidate(item.getId());
        // 删除数据到redis
        redisTemplate.delete(RedisHandler.ITEM_KEY + item.getId());
    }
}
